package Java7_Concurrency_Cookbook.fork_join.recursive_task_cancel;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;

/**
 * 在ForkJoinPool类中执行ForkJoinTask对象时, 在任务开始执行前可以取消它.<br/>
 * ForkJoinTask类提供了cancel()方法来达到取消任务的目的
 * <br/><br/>
 * 通常, fork()和join()成对出现<br/>
 * fork()用于将任务发送到线程池, 发送成功后立即返回.
 * join()用于获取fork()发送的线程的执行结果.<br/>
 * 通常, 为了方便join()获取fork()发送的线程的执行结果,
 * fork()发送的任务会存在一个列表中,方便join()通过列表访问任务的执行结果.<br/>
 * 如示例SearchNumberTask line 59-63中展示的那样:
 * <pre>
 *      manager.addTask(task1);
 *      manager.addTask(task2);
 *      // 发送任务到线程池
 *      task1.fork();
 *      task2.fork();
 * </pre>
 * @author lixiangke
 * @date 2017/11/23
 */
public class Main {
    public static void main(String[] args) throws InterruptedException {
        ArrayGenerator generator = new ArrayGenerator();
        int[] array = generator.generateArray(1000);
        TaskManager manager = new TaskManager();
        ForkJoinPool pool = new ForkJoinPool();
        SearchNumberTask task = new SearchNumberTask(array, 0, 1000, 5, manager);
        pool.execute(task);
        pool.shutdown();
        pool.awaitTermination(1, TimeUnit.DAYS);
        System.out.println("Main: The program has finished\n");
    }
}
